home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 6.8 KB | 280 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // SpriteCompiler.c
- //
- // Portions are copyright: © 1991-94 Tony Myles, All rights reserved worldwide.
- //
- // Description: implementation of the sprite compiler
- ///--------------------------------------------------------------------------------------
-
- #ifndef __TYPES__
- #include <Types.h>
- #endif
-
- #ifndef __MEMORY__
- #include <Memory.h>
- #endif
-
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
-
- #ifndef __QUICKDRAW__
- #include <QuickDraw.h>
- #endif
-
- #ifndef __SWCOMMON__
- #include <SWCommonHeaders.h>
- #endif
-
- #ifndef __SPRITEFRAME__
- #include <SpriteFrame.h>
- #endif
-
- #ifndef __SPRITEWORLDUTILS__
- #include <SpriteWorldUtils.h>
- #endif
-
- #ifndef __SPRITECOMPILER__
- #include <SpriteCompiler.h>
- #endif
-
- #include "BlitPixieHeader.h"
-
- #pragma mark [68k only:]
-
- ///--------------------------------------------------------------------------------------
- // SWCompileSprite
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC OSErr SWCompileSprite(
- SpritePtr srcSpriteP)
- {
- OSErr err = noErr;
- #if SW_68K
- short frame;
-
- for (frame = 0; (err == noErr) && (frame < srcSpriteP->numFrames); frame++)
- {
- err = SWCompileFrame( srcSpriteP->frameArray[frame] );
- }
-
- SWSetStickyIfError( err );
- #else
- #pragma unused(srcSpriteP)
- #endif
- return err;
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SWCompileFrame
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC OSErr SWCompileFrame(
- FramePtr srcFrameP)
- {
- OSErr err = noErr;
- #if SW_68K
- PixelCodeHdl newPixCodeH = NULL;
- Boolean lockedState;
- RectPtr frameRectP;
- unsigned long maskBaseOffset;
-
- // can't do this stuff if the Frame is unlocked
- lockedState = srcFrameP->isFrameLocked;
- if ( lockedState == false )
- SWLockFrame(srcFrameP);
-
- if ( srcFrameP->frameDepth < 8 ||
- (**srcFrameP->framePixHndl).pixelSize != (**srcFrameP->maskPixHndl).pixelSize )
- {
- err = kWrongDepthErr;
- }
-
- if ( srcFrameP->maskPort == NULL )
- err = kWrongMaskErr;
-
- if ( err == noErr )
- {
- frameRectP = &srcFrameP->frameRect;
-
- maskBaseOffset =
- SW_ROWBYTES( srcFrameP, frameRectP->top ) +
- SW_PIXELBYTES( srcFrameP, frameRectP->left );
-
- err = BlitPixieCodeParsePixels(
- // offset to the first pixel of the mask
- (UInt8 *) (srcFrameP->maskBaseAddr + maskBaseOffset),
- // rowBytes of data
- srcFrameP->frameRowBytes,
- // number of bytes in a row
- SW_PIXELBYTES( srcFrameP, frameRectP->right - frameRectP->left ),
- // number of rows
- (frameRectP->bottom - frameRectP->top),
- // receives handle to compiled mask
- &newPixCodeH);
-
- if (err == noErr)
- {
- // get rid of old compiled mask, if any
- if ( srcFrameP->pixCodeH != NULL )
- DisposeHandle( (Handle)srcFrameP->pixCodeH );
-
- // attach the new one
- srcFrameP->pixCodeH = (CompiledHandle) newPixCodeH;
- }
- }
-
- if ( lockedState == false )
- SWUnlockFrame(srcFrameP);
- if ( lockedState == true && err == noErr )
- {
- HLock((Handle)srcFrameP->pixCodeH);
- srcFrameP->frameBlitterP = *srcFrameP->pixCodeH;
- }
-
- SWSetStickyIfError( err );
- #else
- #pragma unused(srcFrameP)
- #endif
- return err;
- }
-
- #pragma mark -
-
-
- ///--------------------------------------------------------------------------------------
- // SWCreateRLEData
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC OSErr SWCreateRLEData(
- SpritePtr srcSpriteP)
- {
- OSErr err = noErr;
- short frame;
- FramePtr srcFrameP;
- RLEPixelDataHdl spriteData,oldData;
- TokenDataHdl frameData;
- unsigned short depth;
- short maxWidth, maxHeight;
- RectPtr rectP;
- Boolean lockedState;
- unsigned long srcBaseOffset;
-
- depth = srcSpriteP->frameArray[0]->frameDepth;
- if ( depth != 8 && depth != 16 && depth != 32)
- err = kWrongDepthErr;
-
- oldData = (RLEPixelDataHdl) srcSpriteP->frameArray[0]->rleDataH;
-
- maxWidth = 0;
- maxHeight = 0;
-
- // calculate max width/height and check depths
- for (frame = 0; (err == noErr) && (frame < srcSpriteP->numFrames); frame++)
- {
- srcFrameP = srcSpriteP->frameArray[frame];
-
- rectP = &srcFrameP->frameRect;
-
- if ( srcFrameP->frameDepth != depth )
- err = kWrongDepthErr;
-
- if ( rectP->right - rectP->left > maxWidth )
- {
- maxWidth = rectP->right - rectP->left;
- }
- if ( rectP->bottom - rectP->top > maxHeight )
- {
- maxHeight = rectP->bottom - rectP->top;
- }
- }
-
- spriteData = (RLEPixelDataHdl) NewHandle( kRLEResourceHeaderSize );
- if ( err == noErr && spriteData != NULL )
- {
- // set RLE data header
- (**spriteData).width = maxWidth;
- (**spriteData).height = maxHeight;
- (**spriteData).depth = depth;
- (**spriteData).palette = 0; // 'clut' res ID, 0 for default
- (**spriteData).frames = srcSpriteP->numFrames;
- (**spriteData).reserved1 = 0;
- (**spriteData).reserved2 = 0;
- (**spriteData).reserved3 = 0;
-
- for (frame = 0; (err == noErr) && (frame < srcSpriteP->numFrames); frame++)
- {
- srcFrameP = srcSpriteP->frameArray[frame];
- rectP = &srcFrameP->frameRect;
-
- if ( srcFrameP->maskPort == NULL )
- {
- err = kWrongMaskErr;
- break;
- }
-
- // can't do this stuff if the Frame is unlocked
- lockedState = srcFrameP->isFrameLocked;
- if ( lockedState == false )
- SWLockFrame(srcFrameP);
-
- srcBaseOffset =
- SW_ROWBYTES( srcFrameP, rectP->top ) +
- SW_PIXELBYTES( srcFrameP, rectP->left );
-
- SW_ASSERT( srcFrameP->frameBaseAddr != NULL );
- SW_ASSERT( srcFrameP->maskBaseAddr != NULL );
-
- err = BlitPixieRLEParsePixels(
- // offset to the first pixel of the image
- (UInt8 *) (srcFrameP->frameBaseAddr + srcBaseOffset),
- // offset to the first pixel of the mask
- (UInt8 *) (srcFrameP->maskBaseAddr + srcBaseOffset),
- // rowBytes of data
- srcFrameP->frameRowBytes,
- // number of bytes in a row
- SW_PIXELBYTES( srcFrameP, rectP->right - rectP->left ),
- // number of rows
- (rectP->bottom - rectP->top),
- // bit depth
- depth,
- // receives handle to compiled mask
- &frameData);
-
- if ( err == noErr && frameData != NULL)
- {
- srcFrameP->rleDataH = (RLETokenHandle) spriteData;
- srcFrameP->rleTokenStart = (RLETokenPtr) (*spriteData + GetHandleSize((Handle) spriteData));
-
- // add this frame's data to the sprite data
- HLock((Handle) frameData);
- err = HandAndHand( (Handle) frameData, (Handle) spriteData );
-
- DisposeHandle( (Handle) frameData );
- }
-
- if ( lockedState == false )
- SWUnlockFrame(srcFrameP);
- }
-
- if ( err != noErr )
- DisposeHandle( (Handle) spriteData );
- else
- {
- // if there was old RLE data, dispose of the (shared) handle now
- if ( oldData != NULL )
- DisposeHandle( (Handle) oldData );
- }
- }
- else
- {
- if ( err == noErr )
- err = MemError();
- }
-
- SWSetStickyIfError( err );
- return err;
- }
-
-